/**
 * File:   DHTNodeTableModel.java
 * Author: Gvennet
 */
package gui.main;

import dht.identifier.identifier.Identifiers;
import dht.node.DHTNodeRow;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * todo write javadoc
 */
public final class DHTNodeTableModel extends AbstractTableModel
{

	private static String[] columnIdentifiers = {
			"ID узла",
			"IP-адрес узла",
			"Порт узла",
			"Время последнего контакта"
	};

	private List<DHTNodeRow> nodes = new ArrayList<DHTNodeRow>();

	//@Override

	public int getRowCount()
	{
		return nodes.size();
	}

	//@Override

	public int getColumnCount()
	{
		return columnIdentifiers.length;
	}

	@Override
	public String getColumnName(int column)
	{
		return columnIdentifiers[column];
	}

	@Override
	public Class<?> getColumnClass(int column)
	{
		switch (column)
		{

			case 0:
				return Identifiers.class; // todo check why Identifier.class does not work
			case 1:
				return String.class;
			case 2:
				return Integer.class;
			case 3:
				return Long.class;
			default:
				throw new AssertionError(column);

		}
	}

	//@Override

	public Object getValueAt(int row, int column)
	{
		switch (column)
		{
			case 0:
				return nodes.get(row).getId();
			case 1:
				return nodes.get(row).getInetAddress().getHostName();
			case 2:
				return nodes.get(row).getPort();
			case 3:
				return nodes.get(row).getContactTime();
			default:
				throw new AssertionError(column);
		}

	}

	public void addRow(DHTNodeRow nodeRow)
	{
		nodes.add(nodeRow);
		fireTableRowsInserted(nodes.size() - 1, nodes.size() - 1);
	}

	public void removeRow(DHTNodeRow nodeRow)
	{
		nodes.remove(nodeRow);
		fireTableRowsDeleted(nodes.size() - 1, nodes.size() - 1);
	}


	public void newData(List<DHTNodeRow> list)
	{
		nodes.clear();
		nodes.addAll(list);
		fireTableDataChanged();
	}

	public void updateRow(DHTNodeRow nodeRow)
	{
		for (int i = 0; i < nodes.size(); i++)
		{
			if (nodes.get(i).equals(nodeRow))
			{
				fireTableRowsUpdated(i, i);
			}
		}
		// fireTableDataChanged();
	}

	public static class DateRenderer extends DefaultTableCellRenderer
	{

		DateFormat formatter;

		public DateRenderer()
		{
			super();
		}

		@Override
		public void setValue(Object value)
		{
			if (formatter == null)
			{
				formatter = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy");
			}
			setText(value == null ? "" : formatter.format(value));
		}
	}


}

